// select 语句只能与channel 一起使用
package main

import (
	"fmt"
	"time"
)

func main() {
	test1()
	println()

	test2()
}

func test1() {
	// 定义数组类型的channel
	intChannels := [3]chan int{
		make(chan int, 1),
		make(chan int, 1),
		make(chan int, 1),
	}
	// 随机选择一个channel 并发送元素
	// index := rand.Intn(3) //使用一个随机数
	index := 2
	fmt.Printf("索引是 %d,", index)
	intChannels[index] <- index

	// 哪一个通道中有可取的元素值，哪个对应的分支就会被执行
	select {
	case <-intChannels[0]:
		fmt.Println("执行分支0")
	case <-intChannels[1]:
		fmt.Println("执行分支1")
	case element := <-intChannels[2]: //可以把channel元素的值赋给一个普通变量
		fmt.Printf("执行分支2,对应的元素是: %d \n", element)
	default:
		fmt.Println("没有分支被执行")
	}

	//输出: 索引是 2,执行分支2,对应的元素是: 2
}

func test2() {
	intChan := make(chan int, 1)
	time.AfterFunc(time.Second, func() { // 一秒后关闭channel
		close(intChan)
	})
	select {
	case _, ok := <-intChan:
		if !ok {
			fmt.Println("channel已关闭")
			break
		}
		fmt.Println("已选择当前分支")
	}

	//输出: channel已关闭
}
